package bancosys.tec.utils.exception;

/**
 * @created Apr 16, 2008
 * @author Gustavo Almeida
 */
public final class ExceptionUtils {

    /**
     * Construtor privado.
     */
    private ExceptionUtils() {
        // propositalmente vazio
    }

    /**
     * Devolve a causa da exceção que seja uma instancia de <code>type</code>
     * 
     * @param <T> tipo da causa procurada.
     * @param throwable exceção
     * @param type tipo da causa procurada.
     * @return a causa da exceção que seja uma instancia de <code>type</code> ou <code>null</code> caso ela não exista.
     */
    @SuppressWarnings("unchecked")
    public static <T extends Throwable> T getCause(Throwable throwable, Class<T> type) {
        Throwable e = throwable;
        while (true) {
            if (type.isInstance(e)) {
                return (T) e;
            }

            if (e.getCause() == null || e.getCause() == e) {
                return null;
            } else {
                e = e.getCause();
            }
        }

    }
}
